package org.gd.hellojavacore.patterns.factorymethod;

import org.gd.hellojavacore.patterns.CreationalPattern;

/**
<pre>

 Фабричный метод (англ. Factory Method) — порождающий шаблон проектирования,
 предоставляющий подклассам интерфейс для создания экземпляров некоторого класса.
 В момент создания наследники могут определить, какой класс создавать.
 Иными словами, Фабрика делегирует создание объектов наследникам родительского класса.
 Это позволяет использовать в коде программы не специфические классы,
 а манипулировать абстрактными объектами на более высоком уровне.
 Также известен под названием виртуальный конструктор (англ. Virtual Constructor).

 ----------------------------------------------------------------------------------------------

 Цель

 Определяет интерфейс для создания объекта, но оставляет подклассам решение о том,
 какой класс инстанциировать. Фабричный метод позволяет классу делегировать создание подклассов.
 Используется, когда:

 1. классу заранее неизвестно, объекты каких подклассов ему нужно создавать.
 2. класс спроектирован так, чтобы объекты, которые он создаёт, специфицировались подклассами.
 3. класс делегирует свои обязанности одному из нескольких вспомогательных подклассов,
 и планируется локализовать знание о том, какой класс принимает эти обязанности на себя.

 </pre>

 *
 * @author Gorhover
 */
public class FactoryMethod implements CreationalPattern {

    public static void main(String...args) {
        /* an array of creators */
        Creator[] creators = {
                new ConcreteCreatorA(),
                new ConcreteCreatorB()
        };
        /* iterate over creators and create products */
        for (Creator creator: creators) {
            Product product = creator.factoryMethod();
            System.out.printf("Created {%s}\n", product.getClass());
        }
    }
}



